﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SCEM.DTO;

namespace SCEM.DataLayer
{
    /// <summary>
    /// Interface para os DAOs do SCEM parametrizada em TEntity.
    /// </summary>
    /// <typeparam name="TEntity">Uma entidade do EntityFramework.</typeparam>
    public interface IDAO<TEntity>
    {
        /// <summary>
        /// Salva uma nova entidade do tipo TEntity no banco de dados.
        /// </summary>
        /// <param name="dto">Um DTO representando a entidade a ser gravada no banco.</param>
        /// <returns>Um DTO representando a entidade gravada no banco ou <code>null</code> em caso de erro.</returns>
        IDTO<TEntity> Save(IDTO<TEntity> dto);

        /// <summary>
        /// Atualiza uma entidade do tipo TEntity no banco de dados.
        /// </summary>
        /// <param name="dto">Um DTO representando a entidade a ser atualizada no banco.</param>
        /// <returns>Um DTO representando a entidade atualizada no banco ou <code>null</code> em caso de erro.</returns>
        IDTO<TEntity> Update(IDTO<TEntity> dto);

        /// <summary>
        /// Recupera uma entidade do tipo TEntity do banco de dados.
        /// </summary>
        /// <param name="id">A identificação da entidade que se deseja recuperar.</param>
        /// <returns>Um DTO representando a entidade procurada ou <code>null</code> caso a entidade não possa ser localizada ou caso ocorra um erro.</returns>
        IDTO<TEntity> Get(string id);

        /// <summary>
        /// Recupera um subconjunto de todas as entidades do tipo TEntity para exibição em um formato paginado.
        /// </summary>
        /// <param name="pageNumber">O número da página (>= 1).</param>
        /// <param name="resultsPerPage">A quantidade de resultados a serem exibidos por página.</param>
        /// <param name="includeDisabledEntities"><code>true</code> para incluir entidades desativadas, <code>false</code> caso contrário.
        /// Ignorado quando a entidade não pode ser desabilitada.</param>
        /// <returns>Uma lista contendo um subconjunto de todas as entidades do tipo TEntity.</returns>
        List<IDTO<TEntity>> GetAll(int pageNumber, int resultsPerPage, bool includeDisabledEntities);

        /// <summary>
        /// Retorna o total de entidades do tipo TEntity cadastradas.
        /// </summary>
        /// <param name="includeDisabledEntities"><code>true</code> para incluir entidades desativadas, <code>false</code> caso contrário.
        /// Ignorado quando a entidade não pode ser desabilitada.</param>
        /// <returns>O total de entidades cadastradas.</returns>
        int GetTotalEntities(bool includeDisabledEntities);

        /// <summary>
        /// Desativa uma entidade no banco de dados.
        /// </summary>
        /// <param name="id">O id da entidade que se deseja desativar.</param>
        /// <returns><code>true</code> em caso de sucesso, <code>false</code> caso contrário.</returns>
        bool Disable(string id);

    }

}
